namespace CSharpPro._1014;
using System;

/// <summary>
/// 学生类，包含学生基本信息及相关操作
/// </summary>
public class Student : IComparable<Student>
{
    // 私有字段
    private string _studentId;  // 学号（唯一标识）
    private string _name;       // 姓名
    private int _age;           // 年龄
    private double _score;      // 成绩

    // 公共属性（带数据验证）
    public string StudentId 
    { 
        get => _studentId; 
        set 
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("学号不能为空");
            _studentId = value;
        } 
    }

    public string Name 
    { 
        get => _name; 
        set 
        {
            if (string.IsNullOrWhiteSpace(value))
                throw new ArgumentException("姓名不能为空");
            _name = value;
        } 
    }

    public int Age 
    { 
        get => _age; 
        set 
        {
            if (value < 0 || value > 150)
                throw new ArgumentOutOfRangeException("年龄必须在0-150之间");
            _age = value;
        } 
    }

    public double Score 
    { 
        get => _score; 
        set 
        {
            if (value < 0 || value > 100)
                throw new ArgumentOutOfRangeException("成绩必须在0-100之间");
            _score = value;
        } 
    }

    // 构造函数
    public Student(string studentId, string name, int age, double score)
    {
        StudentId = studentId;
        Name = name;
        Age = age;
        Score = score;
    }

    // 显示学生信息的方法
    public void ShowInfo()
    {
        Console.WriteLine($"学号：{StudentId}");
        Console.WriteLine($"姓名：{Name}");
        Console.WriteLine($"年龄：{Age}");
        Console.WriteLine($"成绩：{Score}");
        Console.WriteLine("------------------------");
    }

    // 实现IComparable接口，用于对象排序（按成绩升序）
    public int CompareTo(Student other)
    {
        if (other == null) return 1;
        return Score.CompareTo(other.Score);
    }

    // 重写ToString方法，便于打印对象
    public override string ToString()
    {
        return $"{StudentId}\t{Name}\t{Age}\t{Score}";
    }
}
